// 命令处理器类型（支持异步）
export type CommandHandler<T = any> = (...args: any[]) => Promise<T>;

// 命令结果接口
export interface CommandResult {
  success: boolean;
  message?: string;
  data?: any;
}

export interface CommandMetadata {
  moduleName: string;
  commandName: string;
  type: 'ui' | 'service';
  context?: Record<string, any>;
}

export interface Command extends CommandMetadata {
  moduleName: string;
  commandName: string;
  type: 'ui' | 'service';
  handler: CommandHandler;
  params: any[];
}

// 命令注册项接口
export interface CommandRegistryItem extends CommandMetadata {
  handler: CommandHandler;
}


/**
 * 命令服务核心接口
 * 定义跨模块命令执行的契约
 */
export interface ICommandService {
  /**
   * 为UI层注册命令处理器
   * @param module 模块名称 
   * @param type 命令类型 ('ui' | 'service')
   * @param name 命令名称
   * @param handler 命令处理函数
   */
  registerForUi(
    module: string, 
    name: string,
    handler: CommandHandler,
    context?: Record<string, any>
  ): void;

  /**
   * 为服务层注册命令处理器
   * @param module 模块名称
   * @param type 命令类型 ('ui' | 'service')
   * @param name 命令名称
   * @param handler 命令处理函数
   */
  registerForService(
    module: string,
    name: string,
    handler: CommandHandler,
    context?: Record<string, any>
  ): void;

  /**
   * 执行UI层命令
   * @param module 模块名称
   * @param commandName 命令名称
   * @param params 命令参数
   * @returns Promise封装的结果
   */
  executeForUi(
    module: string,
    commandName: string,
    ...params: any[]
  ): Promise<any>;

  /**
   * 执行服务层命令
   * @param module 模块名称
   * @param commandName 命令名称
   * @param params 命令参数
   * @returns Promise封装的结果
   */
  executeForService(
    module: string,
    commandName: string,
    ...params: any[]
  ): Promise<any>;

  /**
   * 执行前处理
   * @returns Promise
   */
  beforeExecute(registryItem: CommandRegistryItem | undefined): Promise<void>;
}